package dblog

import (
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/model/user"
	"time"
)

/*
 * method  GET
 * path    /api/user/log
 */

type _LogJson struct {
	Id         uint      `json:"id"`
	Username   string    `json:"username"`
	Level      string    `json:"level"`
	Content    string    `json:"content"`
	CreateTime time.Time `json:"createTime"`
}

// GetLog GET请求，获取角色
func GetLog(ctx *fiber.Ctx) error {

	// 获取请求参数
	keyword := ctx.Query("keyword")
	level := ctx.Query("level")

	// 计算分页，mysql第一页为0计算
	pageSize := ctx.QueryInt("pageSize", 10)
	current := ctx.QueryInt("current", 1)
	offSet := (current - 1) * pageSize

	// 总数
	var total int64

	// 指定数据model
	var logs []user.Logs
	var leveList []string
	if len(level) > 0 {
		leveList = append(leveList, level)
	} else {
		leveList = append(leveList, "info")
		leveList = append(leveList, "warn")
		leveList = append(leveList, "error")
	}

	// 关键词匹配
	if len(keyword) != 0 {
		keyword = "%" + keyword + "%"
		r := global.DB.Where("level IN ?", leveList).
			Where("username LIKE ?", keyword).
			Or("content LIKE ?", keyword).
			Model(&user.Logs{}).Count(&total)
		if r.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据库查询出错！" + r.Error.Error(),
			})
		}
		if r.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据库查询出错！" + r.Error.Error(),
			})
		}

		// 2，分页处理
		if err := r.Order("id desc").Offset(offSet).Limit(pageSize).Find(&logs); err.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据分页出错！" + err.Error.Error(),
			})
		}
	} else {

		// 匹配全部数据，计算总数
		r := global.DB.Where("level IN ?", leveList).
			Model(&user.Logs{}).Count(&total)
		if r.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据库查询出错！" + r.Error.Error(),
			})
		}
		if r.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据库查询出错！" + r.Error.Error(),
			})
		}

		// 2，分页处理
		if err := r.Order("id desc").Offset(offSet).Limit(pageSize).Find(&logs); err.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "数据分页出错！" + err.Error.Error(),
			})
		}
	}

	// 查询结束返回结果
	return ctx.JSON(fiber.Map{
		"status":   "done",
		"success":  true,
		"message":  "请求成功！",
		"data":     logs,
		"total":    total,
		"current":  current,
		"pageSize": pageSize,
	})
}
